package ar.edu.utn.frgp.TPFinalBanco.action;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;

import ar.edu.utn.frgp.TPFinalBanco.model.Cliente;
import ar.edu.utn.frgp.TPFinalBanco.model.Cuenta;
import ar.edu.utn.frgp.TPFinalBanco.model.PagoPrestamo;
import ar.edu.utn.frgp.TPFinalBanco.model.Prestamo;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionPagoPrestamoServiceImpl;
import ar.edu.utn.frgp.TPFinalBanco.service.impl.GestionPrestamoServiceImpl;

import com.opensymphony.xwork2.ActionContext;

public class ElegirPagarPrestamoAction extends BaseAction{


	private static final long serialVersionUID = -8241626536031542868L;
	private Map<String, Object> session;
	private Date ahora;
	private Boolean recargo;
	private Boolean tiene;
	private Boolean loguio;
	private Integer idPrestamoPagar;
	private Cliente cliente;
	
	public String execute() throws Exception{
		
		//verificar si el cliente esta logueado
		//if (ActionContext.getContext().getSession()!=null) {
			//List<Prestamo> prestamo;
			setLoguio(true);
		
			// paso la session.
			setSession(ActionContext.getContext().getSession());
			setCliente((Cliente) session.get("cliente"));
			//obtengo la fecha del sistema
			setAhora(new Date());
			
			SimpleDateFormat dia = new SimpleDateFormat("dd");
			//SimpleDateFormat mes = new SimpleDateFormat("mm");
			
			//verifico si el cliente tiene cuentas
			if(((Cliente) session.get("cliente")).getCantCuentas() > 0){
				setTiene(true);
			}
			//traigo el prestamo
			GestionPrestamoServiceImpl prestamoService = (GestionPrestamoServiceImpl) getContext()
					.getBean("gestionPrestamoService");
			Prestamo prestamo = prestamoService.getPrestamo(idPrestamoPagar);
			session.put("prestamo", prestamo);
			
			//obtengo la lista con los pagos realizados
			GestionPagoPrestamoServiceImpl pagoPrestamoService = (GestionPagoPrestamoServiceImpl) getContext()
					.getBean("gestionPagoPrestamoService");
			List <PagoPrestamo> pagos= pagoPrestamoService.getListPagoPrestamo(idPrestamoPagar);
			
			//calculo de cuota
			Integer cuotasPagas=pagos.size();
			BigDecimal uno=new BigDecimal(1);
			
			BigDecimal aux1=prestamo.getInteres().multiply((prestamo.getInteres().add(uno)).pow(prestamo.getCantCuotas()));
			BigDecimal aux2=(prestamo.getInteres().add(uno)).pow(prestamo.getCantCuotas()).subtract(uno);
								
			BigDecimal cuota = prestamo.getMonto().multiply(aux1.divide(aux2,2, RoundingMode.HALF_EVEN));
			BigDecimal total = cuota.multiply(new BigDecimal(prestamo.getCantCuotas()-cuotasPagas));
			
			cuota=cuota.setScale(2,RoundingMode.HALF_EVEN);
			total=total.setScale(2,RoundingMode.HALF_EVEN);
						
			//Verifico si el pago se realiza fuera de termino
			if(Integer.parseInt(dia.format(ahora)) > 10){
				setRecargo(true);
				cuota=cuota.multiply(new BigDecimal(1.02));
				total=total.multiply(new BigDecimal(1.02));
			}
			//verifico ultima cuota
			Boolean ultima=false;
			if ((prestamo.getCantCuotas()-cuotasPagas)==1){
				ultima=true;
			}
					
			List<Cuenta> cuentas;
			cuentas = cliente.getCuentas();
			session.put("cuentas",cuentas);
			
			//guardo los montos en la session			
			session.put("total", total.doubleValue());
			session.put("cuota", cuota.doubleValue());
			session.put("ultima",ultima);
						
		//}
				
		return SUCCESS;
	
	}

	public Date getAhora() {
		return ahora;
	}

	public void setAhora(Date ahora) {
		this.ahora = ahora;
	}

	public Map<String, Object> getSession() {
		return session;
	}

	public void setSession(Map<String, Object> session) {
		this.session = session;
	}

	public Boolean getRecargo() {
		return recargo;
	}

	public void setRecargo(Boolean recargo) {
		this.recargo = recargo;
	}

	public Boolean getTiene() {
		return tiene;
	}

	public void setTiene(Boolean tiene) {
		this.tiene = tiene;
	}

	public Boolean getLoguio() {
		return loguio;
	}

	public void setLoguio(Boolean loguio) {
		this.loguio = loguio;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Integer getIdPrestamoPagar() {
		return idPrestamoPagar;
	}

	public void setIdPrestamoPagar(Integer idPrestamoPagar) {
		this.idPrestamoPagar = idPrestamoPagar;
	}


}
